﻿//#define _CRT_SECURE_NO_WARNINGS
//#include <stdio.h>

#include "common.h"

int binary_one_count(int num)
{ // 计算整数二进制在内存中 1 的个数，整型类型是 32 位
    int count = 0, i;
    if (num < 0)
        count = 1; // 负数的二进制表示中最高位为 1
    int mask = (unsigned int)num; // 去掉最高位（符号位保证为 0）
    for (i = 0; i < 30; ++i)
    { // 依次右移一位，判断最低位是否为 1
        if (1 == (mask & 1))
            // 比较运算符优先级高于位运算符，所以要加括号（调用操作）
            ++count;
        mask = mask >> 1; // 右移一位
    }

    return count;
}

int change_bit(int num, int pos)
{ // 改变整数（num）的二进制的右边某一位（pos）的值
    if (pos < 1 || pos > 32)
        return num; // 位数不合法，返回原值
    int flag = 0; // 标记位是否需要改变符号
    if (num < 0)
    {
        flag = 1; // 负数的二进制表示中最高位为 1
        num = ~(num - 1); // 补码减一等于反码，取反得到原码
    }
    int mask = 1 << (pos - 1); // 计算出位掩码
    printf("mask = %d\n", mask);
    num ^= mask; // 则异或上掩码
    if (flag)
        //若结果为负数，则取反得到反码，加一得到补码
        num = -num; // 注意这里的补码是正数，要转负数（- 为单目操作符）
    return num;
}
